package com.foodie.proxy.dynamicproxy;


import com.foodie.proxy.proxycase.IRentHouse;
import com.foodie.proxy.proxycase.RentHouseImpl;
import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK动态代理测试类
 */

public class JDKDynamicProxy {
    /**
     * 模仿租房代理替客户租房
     */
    @Test
    public void rentHoustByJDKDynamicProxy() {
        //客户实现接口，明确自己的租房需求(委托对象)
        IRentHouse rentHouse = new RentHouseImpl();
        //获取代理对象
        //前两个参数是用于创建对象的，最后一个参数是用来做实现功能增强
        Object proxy = Proxy.newProxyInstance(rentHouse.getClass().getClassLoader(), rentHouse.getClass().getInterfaces(), new InvocationHandler() {
            /**
             * @param proxy
             * @param method 当前被调用方法
             * @param args 当前被调用方法传入的参数
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object object = null;
                //功能增强
                System.out.println("收代理租房费300元。");
                //代理本职需要做的事(即调用代理类租房函数)
                object = method.invoke(rentHouse, args);//参数1：委托对象 参数2：传入函数参数
                //功能增强
                System.out.println("客户信息卖了3毛。");
                return object;
            }
        });
        //代理对象去租房
        IRentHouse JDKDynamicRentHouseProxy = (IRentHouse) proxy;
        JDKDynamicRentHouseProxy.rentHouse();
    }
}
